// object.keys()方法
/**
 * 
 */
// 1. 对象
const obj = {
    name: '张三',
    age: 18
}
console.log(Object.keys(obj),'1.对象');
// 2. 遍历对象
const user = {
    username: 'alice',
    password: '123456',
};
Object.keys(user).forEach(key => {
    console.log(`${key}: ${user[key]}`,'2.遍历对象');
});
// 2.1 遍历数组
const user1 = [{
    username: 'alice',
    password: '123456',
},
{
    username: 'bob',
    password: '654321',
}];
user1.forEach(item => {
    Object.keys(item).forEach(key => {
        console.log(`${key}: ${item[key]}`);
    });
})
// 3.数组
const arr = [1, 2, 3, 4, 5];
console.log(Object.keys(arr));
// 2. 继承
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}
class Student extends Person {
    constructor(name, age, grade) {
        super(name, age);
        this.grade = grade;
    }
};
const b = new Student('张三', 18, '一年级');
console.log(Object.keys(b),'3.继承');
// 4. 原型
/**
 * Object.create()的作用
 * Object.create(obj11)会创建一个新对象obj2,并且让obj2的[[Prototype]]指向obj11。
 * 也就是说，obj2自身没有直接定义的属性，它能"继承"obj11上的属性，但这些继承来的属性不属性于obj2自身的可枚举属性
 */
const obj11 = {
    name: '张三',
    age: 18
}
const obj2 = Object.create(obj11);
console.log(Object.keys(obj2));

// 3.返回的属性顺序是什么样的？
// Number: 大于0的整数，会进行排序返回
// String: 按照定义的顺序返回
// Symbol: 过滤掉，不返回。
// 特点：会将对象的属性进行排序，然后返回，但是Symbol属性会被过滤掉
const sa = Symbol('a');
const obj3 = {
    5:'5',
    a:'a',
    1:'1',
    c:'c',
    3:'3',
    b:'b'
};
obj3[sa] = 'sa';
console.log(Object.keys(obj3),'3.顺序返回');

// 4.属性中有Symbol, 返回的顺序是什么样的？
console.log(Object.keys({
    5: '5',
    [Symbol('a')]: 'Symbol',
    3: '3',
    b: 'b',
}),'属性symbol') //[3,5,b]
// 5.属性中有负数和小数，返回的顺序是什么样的？
// Number: 大于0的整数，进行排序返回 （对于负数和小数，不进行排序，它会当做字符串处理）
// String: 按照定义的顺序返回
// Symbol: 过滤掉，不返回
console.log(Object.keys({
    3: '3',
    1: '1',
    '-1': '-1',
    0.2: '0.2'
}),'属性负数和小数');
// 6.Object.keys(null) && Object.keys(undefined)
// 传入的变量 -> 对象 ，都会抛出异常
// Object.keys(null);
// Object.keys(undefined);
// 7.Object.keys(123)
// Number -> Number(123)
console.log(Object.keys(123),'数字');//没有返回值
// 8.Object.keys()方法
// 字符串 -> String(字符串)
console.log(Object.keys('111'),'字符串');